package en.edu.zxj.mq.common.util;

import java.io.*;

/**
 * Created with IntelliJ IDEA.
 * Description：操作二级制数据相关的工具类 -- 提供将 java 对象 反序列化和序列化
 *
 * @author: zxj
 * @date: 2024-02-28
 * @time: 14:33:24
 */
public class BinaryUtils {

    /**
     * @description: 反序列化, 将字节数组转化为 java 对象
     **/
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                // 这里的 readObject 就是将字节数组 反序列为 java 对象
                object = objectInputStream.readObject();
            }
        }
        return object;
    }

    public static byte[] toBytes(Object object) throws IOException {
        // 这个流对象相当于一个变长的字节数据
        // 可以把 Object 序列化的数据逐渐的写入到 byteArrayOutputStream 中, 再统一转成 byte[]
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)){
                // 此处的 writeObject 就会把该对象进行序列化, 生成的二进制字节数据, 就会写入到 ObjectOutputStream中
                // 由于 ObjectOutputStream 又是关联到了 ByteArrayOutputStream 中, 最终结果就写入到 ByteArrayOutputStream 中了
                objectOutputStream.writeObject(object);
            }
            // 这个操作就是把 byteArrayOutputStream 中持有的二进制数据提取出现, 转化为 byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }

}
